package entity;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

import util.UtilColecao;
import util.UtilData;

@Entity
@DiscriminatorValue("1")
public class ContaCredito extends Conta implements Serializable {

	private static final long serialVersionUID = 1082824403447060113L;

	private Integer diaFechamentoFatura;

	private Integer diaVencimentoFatura;

	@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "contaCredito")
	private List<Fatura> listaFaturas;

	public Integer getDiaFechamentoFatura() {
		return diaFechamentoFatura;
	}

	public void setDiaFechamentoFatura(Integer diaFechamentoFatura) {
		this.diaFechamentoFatura = diaFechamentoFatura;
	}

	public Integer getDiaVencimentoFatura() {
		return diaVencimentoFatura;
	}

	public void setDiaVencimentoFatura(Integer diaVencimentoFatura) {
		this.diaVencimentoFatura = diaVencimentoFatura;
	}

	public Fatura buscarFaturaPorAnoMes(Integer anoMesReferencia) {

		if (UtilColecao.isColecaoVazia(listaFaturas)
				|| anoMesReferencia == null) {
			return null;
		}

		for (Fatura fatura : this.getListaFaturas()) {
			if (fatura.getAnoMesReferencia().equals(anoMesReferencia)) {
				return fatura;
			}
		}

		return null;
	}

	public Fatura buscarFaturaPorDate(Date data) {

		int ano = UtilData.getCalendar(data).get(Calendar.YEAR);
		int mes = UtilData.getCalendar(data).get(Calendar.MONTH) + 1;

		return buscarFaturaPorAnoMes(Integer.parseInt(String.format("%04d%02d",
				ano, mes)));
	}

	public Fatura obterProximaFaturaAberta() {

		Collections.sort(listaFaturas);

		for (Fatura fatura : listaFaturas) {
			if (fatura.isFaturaFechada()) {
				return fatura;
			}
		}

		return null;
	}

	public List<Fatura> getListaFaturas() {
		return listaFaturas;
	}

	public void setListaFaturas(List<Fatura> listaFaturas) {
		this.listaFaturas = listaFaturas;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

}
